package org.water.base.repository;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.water.base.entity.AbstractEntity;
import org.water.base.support.BeanQuery;

/**
 * 基础dao接口
 * @author qzy
 *
 * @param <T> 表实体类型
 * @param <ID> 主键类型
 */
@NoRepositoryBean
public abstract interface BaseRepository<T extends AbstractEntity<?>,ID extends Serializable> extends JpaRepository<T, ID> {
	
	/**
	 * 根据主键查询数据
	 * @param id
	 * @return
	 */
	public T findOne(ID id);
	/**
	 * 根据主键删除单个
	 */
    public void delete(final ID id);  
	/**
     * 根据主键删除多条数据
     *
     * @param ids
     */
    public void delete(ID[] ids);
    /**
	 * 原生态SQL查询，返回List<Map<String, Object>>
	 * @param sql
	 * @return
	 */
	public List<Map<String,Object>> createNativeQueryToMap(String sql);
	/**
	 * 原生态SQL查询，返回List<Map<String, Object>>
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<Map<String,Object>> createNativeQueryToMap(String sql,Map<String, Object> params);
	/**
	 * 原生态SQL查询，返回List<Map<String, Object>>
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<Map<String,Object>> createNativeQueryToMap(String sql,Object[] params);
	/**
	 * 列表查询bean  
	 * 原生态SQL查询，返回List<bean>
	 * @param sql
	 * @param resultClass //返回结果bean class
	 * @return
	 */
	//@SuppressWarnings("rawtypes")
	//public List<T> createNativeQueryToBean(String sql,Class resultClass);
	/**
	 * 列表查询 bean
	 * 原生态SQL查询，返回List<bean>
	 * @param sql
	 * @param params  键值对传参
	 * @param resultClass //返回结果bean class
	 * @return
	 */
	//@SuppressWarnings("rawtypes")
	//public List<T> createNativeQueryToBean(String sql,Map<String, Object> params,Class resultClass);
	
	/**
	 * 列表查询bean
	 * 原生态SQL查询，返回List<bean>
	 * @param sql
	 * @param params  顺序传参
	 * @param resultClass //返回结果bean class
	 * @return
	 */
	//@SuppressWarnings("rawtypes")
	//public List<T> createNativeQueryToBean(String sql,Object[] params,Class resultClass);
	/**
	 * 分页查询map
	 * 原生态SQL查询，返回Page<Map<String, Object>
	 * @param sql
	 * @param params   键值对传参
	 * @param pageable
	 * @return
	 */
	public Page<Map<String,Object>> createNativeQueryToMap(String sql,Map<String, Object> params,final Pageable pageable);
	/**
	 * 原生态SQL查询，返回Page<Map<String, Object>
	 * @param sql
	 * @param params
	 * @param pageable
	 * @return
	 */
	public Page<Map<String,Object>> createNativeQueryToMap(String sql,Object[] params,final Pageable pageable);
	/**
	 * 分页查询bean
	 * 原生态SQL查询，返回List<bean>
	 * @param sql
	 * @param params  键值对传参
	 * @param pageable
	 * @param resultClass //返回结果bean class
	 * @return
	 */
	//@SuppressWarnings("rawtypes")
	//public Page<T> createNativeQueryToBean(String sql,Map<String, Object> params,final Pageable pageable,Class resultClass);
	/**
	 * 分页查询 bean
	 * 原生态SQL查询，返回Page<Bean>
	 * @param sql
	 * @param params 顺序传参
	 * @param pageable
	 * @param resultClass //返回结果bean class
	 * @return
	 */
	//@SuppressWarnings("rawtypes")
	//public Page<T> createNativeQueryToBean(String sql,Object[] params,final Pageable pageable,Class resultClass);
	
	/**
	 * 执行原生sql语句,更新/插入  
	 * @param sql
	 * @param params
	 */
	public Integer excuteNativeSql(String sql,Object[] params);
	/**
	 * 执行原生sql语句  ,更新/插入  
	 * @param sql
	 * @param params
	 */
	public Integer excuteNativeSql(String sql,Map<String, Object> params);
	/**
	 * bean查询
	 * @param class1
	 * @return
	 */
	public <M> BeanQuery<M> createBeanQuery(Class<M> clazz);
	/**
     * 刷新实体
     * @param m
     */
    public void refresh(T t);
    
    /**
     * 获取EntityManager
     * 
     */
    public EntityManager getEntityManager();
    
}
